package com.cskaoyan.javase.oop2._1extends._5protected._3example;

/**
 * Java所有类都直接或间接地继承了Object
 * 也会同时继承它当中的一个protected修饰的成员方法clone()
 *
 * 分析:
 * clone方法这个受保护的成员处在java.lang包下的Object类当中
 * 并且java中所有的类都会继承Object
 *
 * 所以在不同包下的子类中,只能创建子类自身对象,才能够访问.
 *
 * 扩展:
 * 方法的重写,除了可以修改方法的实现(内容)以外,还可以修改方法的访问权限!
 *
 * @since 17:19
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        // 问题1,这里创建Student对象,使用Student引用能否访问clone方法呢?
        // 答案是不行,创建对象后访问不到
        Student s = new Student();
        // 'clone()' has protected access in 'java.lang.Object'
        // s.clone();

        // 问题2,这里创建Demo对象,使用Demo引用能否访问clone方法呢?
        // 答案是可以
        Demo d = new Demo();
        // Unhandled exception: java.lang.CloneNotSupportedException
        d.clone();

        // 问题3,这里创建Teacher对象,使用Teacher引用能否访问clone方法呢?
        // 是可以的,因为已经重写了访问权限,现在已经是同包的关系了
        Teacher t = new Teacher();
        t.clone();
    }
}

class Student {
}
class Teacher{
    // 重写父类protected方法的访问权限
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}